/**
 * 作用：给打包输出文件添加注释
 * 开发思路：
 * 1、需要打包输出前添加注释：需要使用compiler.hooks.emit钩子，它是在打包输出前触发。
 * 2、如何获取打包输出的资源？compilation.assets可以获取所有即将输出的资源文件。
 */
class BannerWebpackPlugin {
  constructor(options = {}) {
    this.$options = options
  }

  apply(compiler) {
    compiler.hooks.emit.tapAsync('BannerWebpackPlugin', (compilation, callback) => {
      // 1、获取即将输出的资源文件 compilation.assets
      // 2、过滤得到js和css资源
      const extensions = ['css', 'js']
      const assetsKeys = Object.keys(compilation.assets).filter(assetsPath => {
        return extensions.includes(assetsPath.split('.')[1])
      })
      // 3、遍历资源添加注释
      const prefix = `/**
* Author: ${this.$options.author}
*/`
      assetsKeys.forEach(key => {
        // 获取原来的内容
        const source = compilation.assets[key].source()
        const content = prefix + source
        // 修改资源
        compilation.assets[key] = {
          // 最终输出的资源
          source() {
            return content
          },
          // 资源大小
          size() {
            return content.length
          }
        }
      })

      callback()
    })
  }
}

module.exports = BannerWebpackPlugin
